#include <iostream>
#include <cstring>
#include <queue>

using namespace std;

const int N=3*1e5+10;

int a[N];
int h[N],ne[N],to[N],idx;
int depth[N];
int f[N][21];
int d[N];
void add(int x,int y)
{
	ne[idx]=h[x];
	to[idx]=y;
	h[x]=idx++;
}
void bfs()
{
	memset(depth,0x3f3f,sizeof(depth));
	depth[0]=0;
	depth[1]=1;
	queue<int> q;
	q.push(1);
	while(q.size())
	{
		int u=q.front();
		q.pop();
		for(int i=h[u];~i;i=ne[i])
		{
			int j=to[i];
			
			if(depth[j]>depth[u]+1)
			{
				depth[j]=depth[u]+1;
				f[j][0]=u;
				for(int k=1;k<=20;k++)
					f[j][k]=f[f[j][k-1]][k-1];
				q.push(j);			
			}
		}
	}
}
int lca(int x,int y)
{
	if(depth[x]<depth[y])
		swap(x,y);
	for(int i=20;i>=0;i--)
	{
		if(depth[f[x][i]]>=depth[y])
			x=f[x][i];
	}	
	if(x==y)
		return x;
	for(int i=20;i>=0;i--)
	{
		if(f[x][i]!=f[y][i])
		{
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
int dfs(int u,int fa)
{
	for(int i=h[u];~i;i=ne[i])
	{
		int j=to[i];
		if(j==fa)
			continue;
		d[u]+=dfs(j,u);
	}
	return d[u];
	
}
int main()
{
	int n;
	cin>>n;
	memset(h,-1,sizeof(h));
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		
	}
	for(int i=1;i<n;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		add(x,y);
		add(y,x);	
	}
	bfs();
	for(int i=1;i<n;i++)
	{
		int x=a[i],y=a[i+1];
		int p=lca(x,y);
		if(p!=y)
		{
			y=f[y][0];
		}
		else{
			int tmp=x;
			for(int k=20;k>=0;k--)
			{
				if(depth[f[tmp][k]]>depth[y])
					tmp=f[tmp][k];
			}
			y=tmp,p=tmp;
		}
		d[x]+=1,d[y]+=1;
		d[p]-=1,d[f[p][0]]-=1;
	}
	dfs(1,0);

	for(int i=1;i<=n;i++)
		cout<<d[i]<<endl;
	return 0;
}
